package com.qba.trafficbb.modelo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import android.content.Context;
import android.os.Bundle;

import com.qba.trafficbb.R;
import com.qba.trafficbb.modelo.extractor.ExtractorPreguntas;
import com.qba.trafficbb.modelo.pregunta.Pregunta;
import com.qba.trafficbb.modelo.pregunta.PreguntaImagen;
import com.qba.trafficbb.persistencia.LectorSenales;

public class Juego {

	protected List<Senal> listaSenales;

	protected List<Pregunta> listaPreguntasAnteriores;

	protected Pregunta preguntaActual;
	protected int indicePreguntaActual = 1;

	protected ExtractorPreguntas extractorPreguntas;

	private Class clasePregunta;

	private static Juego instancia;

	public static Juego obtieneInstancia(Context contexto) {
		if (instancia == null)
			instancia = new Juego(Arrays.asList(LectorSenales.leeSenales(
					R.raw.senales_db, contexto)));
		return instancia;
	}

	private Juego(List<Senal> lstSenales) {
		listaSenales = lstSenales;
		reinicia();
		clasePregunta = PreguntaImagen.class;
		extractorPreguntas = new ExtractorPreguntas();
	}

	public void reinicia() {
		if (listaPreguntasAnteriores == null) {
			listaPreguntasAnteriores = new ArrayList<Pregunta>();
		}

		preguntaActual = null;
		listaPreguntasAnteriores.clear();
	}

	public void avanzaAProximaPregunta() {
		if (indicePreguntaActual < listaPreguntasAnteriores.size()) {
			indicePreguntaActual++;
			preguntaActual = listaPreguntasAnteriores.get(indicePreguntaActual - 1);
		} else {
			if (preguntaActual != null) {
				guardaPreguntaActual();
				indicePreguntaActual++;
			} else { // Significa que acaba de empezar a generar preguntas
				indicePreguntaActual = 1; 
			}
			preguntaActual = extractorPreguntas.extraeNuevaPregunta(this);
		}
	}
	
	public void guardaPreguntaActual() {
		listaPreguntasAnteriores.add(preguntaActual);
	}
	
	public void retrocedeAPreguntaAnterior() {
		if (indicePreguntaActual > 1) {
			indicePreguntaActual--;
			preguntaActual = listaPreguntasAnteriores.get(indicePreguntaActual - 1);
		}
	}

	public String obtienePreguntaActual() {
		return preguntaActual.obtienePregunta();
	}

	public String[] obtieneRespuestasActuales() {
		return preguntaActual.obtieneRespuestas();
	}

	public void respondePreguntaActual(int respuesta) {
		preguntaActual.responde(respuesta);
	}

	public int obtieneRespuestaActual() {
		return preguntaActual.obtieneRespuesta();
	}
	
	public List<Senal> getListaSenales() {
		return listaSenales;
	}

	public void setListaSenales(List<Senal> listaSenales) {
		this.listaSenales = listaSenales;
	}

	public Class getClasePregunta() {
		return clasePregunta;
	}

	public void setClasePregunta(Class clasePregunta) {
		this.clasePregunta = clasePregunta;
	}

	public int getPuntuacion() {
		int respCorrectas = 0;
		for (Pregunta p: listaPreguntasAnteriores) {
			if (p.obtienePosicionRespuestaCorrecta() == p.obtieneRespuesta())
				respCorrectas++;
		}
		return respCorrectas;
	}

	public List<Pregunta> obtenerPreguntasAnteriores() {
		return listaPreguntasAnteriores;
	}
}
